"""
日志模块入口。

提供统一、简洁的日志API，用于在框架中记录各种级别和类型的日志信息，
支持灵活的配置、格式化和过滤选项。
"""

import logging
from typing import Dict, Union, Optional, Any

# 导出主要组件
from .config import (
    LoggingConfig,
    get_config,
    configure_logging,
    get_logger,
    set_module_level,
    set_level_for_group,
)
from .formatters import (
    ColoredFormatter,
    JsonFormatter,
    StructuredFormatter,
    create_formatter,
)
from .filters import (
    ModuleFilter,
    LevelRangeFilter,
    RegexFilter,
    DuplicateFilter,
    create_filter,
)
from .reporters import (
    SummaryReporter,
    HookSummaryReporter,
    TrainingStatsReporter,
)

__all__ = [
    # 配置相关
    "LoggingConfig",
    "get_config",
    "configure_logging",
    "get_logger",
    "set_module_level",
    "set_level_for_group",
    # 格式化器
    "ColoredFormatter",
    "JsonFormatter",
    "StructuredFormatter",
    "create_formatter",
    # 过滤器
    "ModuleFilter",
    "LevelRangeFilter",
    "RegexFilter",
    "DuplicateFilter",
    "create_filter",
    # 报告器
    "SummaryReporter",
    "HookSummaryReporter",
    "TrainingStatsReporter",
    # 简便函数
    "setup_default_logging",
    "setup_colored_logging",
    "setup_json_logging",
]

# 日志级别常量，方便用户使用
DEBUG = logging.DEBUG
INFO = logging.INFO
WARNING = logging.WARNING
ERROR = logging.ERROR
CRITICAL = logging.CRITICAL


def setup_default_logging(
    level: Union[int, str] = logging.INFO,
    module_levels: Dict[str, Union[int, str]] = None,
    log_file: Optional[str] = None,
) -> None:
    """
    使用默认设置快速配置日志系统。

    Args:
        level: 全局默认日志级别
        module_levels: 特定模块的日志级别字典
        log_file: 如果提供，日志将同时写入此文件
    """
    config = LoggingConfig(
        default_level=level,
        module_levels=module_levels or {},
        file_output=log_file is not None,
        log_file=log_file,
        use_colors=True,
    )

    configure_logging(config)


def setup_colored_logging(
    level: Union[int, str] = logging.INFO,
    module_levels: Dict[str, Union[int, str]] = None,
    format_string: str = "%(asctime)s - %(levelname)5s - %(name)s - %(message)s",
) -> None:
    """
    配置带有彩色输出的日志系统。

    Args:
        level: 全局默认日志级别
        module_levels: 特定模块的日志级别字典
        format_string: 日志格式字符串
    """
    config = LoggingConfig(
        default_level=level,
        module_levels=module_levels or {},
        format_string=format_string,
        use_colors=True,
    )

    configure_logging(config)


def setup_json_logging(
    level: Union[int, str] = logging.INFO,
    module_levels: Dict[str, Union[int, str]] = None,
    additional_fields: Dict[str, Any] = None,
    log_file: Optional[str] = None,
) -> None:
    """
    配置JSON格式的日志输出。

    Args:
        level: 全局默认日志级别
        module_levels: 特定模块的日志级别字典
        additional_fields: 要添加到每条日志记录的额外字段
        log_file: 如果提供，日志将同时写入此文件
    """
    # 创建JSON格式化器
    json_formatter = JsonFormatter(additional_fields=additional_fields)

    # 配置根日志记录器
    root_logger = logging.getLogger()

    # 清除现有处理器
    for handler in root_logger.handlers[:]:
        root_logger.removeHandler(handler)

    # 设置根记录器级别
    root_logger.setLevel(level)

    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(json_formatter)
    root_logger.addHandler(console_handler)

    # 添加文件处理器（如果需要）
    if log_file:
        file_handler = logging.FileHandler(log_file)
        file_handler.setFormatter(json_formatter)
        root_logger.addHandler(file_handler)

    # 配置模块级日志
    if module_levels:
        for module, level in module_levels.items():
            logging.getLogger(module).setLevel(level)


# 自动配置默认日志（仅在作为模块直接导入时）
if __name__ != "__main__":
    setup_default_logging()
